/*
? AJAX（Asynchronous JavaScript and XML）的请求状态有以下几种：
? 1. 0 - 请求已初始化：XMLHttpRequest对象已创建，但尚未调用 open 方法。
? 2. 1 - 请求已打开： open 方法已被调用，但尚未调用 send 方法。
? 3. 2 - 请求已发送： send 方法已被调用，但尚未接收到响应。
? 4. 3 - 请求正在处理：正在接收响应数据。
? 5. 4 - 请求已完成：响应数据已完全接收。
? axios封装的请求/响应拦截器拦截的内容具体字段取决于您在拦截器中定义的处理逻辑。一般来说，拦截器可以拦截请求和响应的各个阶段，并对其进行相应的处理。

? 对于请求拦截器，它可以拦截请求发送之前的阶段。您可以在请求拦截器中访问请求配置对象，其中包含以下字段：

? -  url ：请求的URL地址
? -  method ：请求的HTTP方法（例如GET、POST等）
? -  headers ：请求的头部信息
? -  params ：请求的URL参数
? -  data ：请求的数据体
?
? 对于响应拦截器，它可以拦截响应返回之前的阶段。您可以在响应拦截器中访问响应对象，其中包含以下字段：
?
? -  status ：响应的HTTP状态码
? -  statusText ：HTTP状态码对应的文本描述
? -  headers ：响应的头部信息
? -  data ：响应的数据体
?
? 您可以根据这些字段来进行自定义的处理逻辑，例如修改请求配置、处理错误、添加认证信息等。
?
? 需要注意的是，具体拦截的字段可能会根据您的实际代码和需求而有所不同。您可以在拦截器中根据需要访问和修改这些字段，以实现您所需的功能。
 */
function ajax(url) {
    return new Promise((resolve, reject) => {
        //? 实例化
        let xhr = new XMLHttpRequest()
        //? 建立连接
        xhr.open('Get',url)
        //? 监听状态改变
        xhr.onreadystatechange = function () {
            /*
            ? readyState表示请求的状态
            ? 1. 0 - 未初始化：XMLHttpRequest对象已创建，但尚未调用open()方法。
            ? 2. 1 - 打开：已经调用open()方法，但尚未调用send()方法。
            ? 3. 2 - 发送：已经调用send()方法，但尚未接收到响应。
            ? 4. 3 - 接收：已经接收到部分响应数据。
            ? 5. 4 - 完成：已经接收到全部响应数据，并且可以在客户端使用。
             */
            if (this.readyState !== 4) return
            if (this.status >= 200 && this.status < 400) {
                resolve(this.response)
            }
            else {
                reject(new Error(this.statusText))
            }
        }
        //? 设置请求头
        xhr.setRequestHeader('Accept',"application/json")
        //? 发送
        xhr.send()
    })
}
